home *** CD-ROM | disk | FTP | other *** search
- ⓪ ⓪ (* Autor: Ulf Reimann, Am Faerberhof 11, 8520 Erlangen *)⓪ (* Gepard -> Atari-Anpassung: Thomas Tempelmann *)⓪ ⓪ (*⓪!* Huffmann-Kodierung⓪!*⓪!* Achtung: Kann keine Null-Bytes verarbeiten! Daher nur für Texte,⓪!* nicht für Binärdateien geeignet!⓪!*)⓪ ⓪ MODULE Pack;⓪ (*$Q+,C-*)⓪ ⓪ FROM SYSTEM IMPORT ADDRESS, ASSEMBLER;⓪ ⓪ IMPORT Storage;⓪ IMPORT Text;⓪ FROM InOut IMPORT WriteString, WriteLn, WriteCard, BusyRead,⓪8Write, KeyPressed, ReadString;⓪ FROM Files IMPORT Open, Close, Remove, Access, Create,⓪8EOF, ReplaceMode, File;⓪ FROM Binary IMPORT Seek, SeekMode, ReadBytes, WriteBytes, FileSize;⓪ FROM Files IMPORT GetStateMsg, State;⓪ FROM Strings IMPORT Compare, Relation, StrEqual, Length, Append,⓪8String, Space, Empty, Assign;⓪ ⓪ TYPE MaxStr = ARRAY [0..99] OF CHAR;⓪ ⓪ VAR strok: BOOLEAN;⓪ ⓪ TYPE charset=SET OF [0C..255C];⓪%pms=POINTER TO MaxStr;⓪%noderef=POINTER TO node;⓪%node=⓪'RECORD⓪)cnt:LONGCARD;⓪)bitcnt:CARDINAL;⓪)bitstr:BitSet;⓪)left:noderef;⓪)right:noderef;⓪)key:pms;⓪'END;⓪%coderef=POINTER TO code;⓪%code=⓪'RECORD⓪)left:coderef;⓪)right:coderef;⓪)CASE :CARDINAL OF⓪)0: nod:noderef |⓪)1: key:pms⓪)END⓪'END;⓪%itemref=POINTER TO item;⓪%item=⓪'RECORD⓪)cnt:LONGCARD;⓪)cod:coderef;⓪)nxt:itemref;⓪)next:itemref⓪'END;⓪ ⓪ CONST alpha=charset{'0'..'9','@','A'..'Z','_','a'..'z'};⓪ ⓪ VAR f,outf:File;⓪$filename,ofilename:MaxStr;⓪$warning,wordmode:BOOLEAN;⓪$ioerr,blocks,bitptr,stotal:CARDINAL;⓪$minmem,bytes,chars,treesize,codesize:LONGCARD;⓪$bufptr,pbuf:ADDRESS;⓪$noderoot:noderef;⓪$itemroot:itemref;⓪$coderoot:coderef;⓪ ⓪ (*$L-,R-*)⓪ ⓪ PROCEDURE putbyte(b:CARDINAL);⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVE -(A3),D0⓪#MOVE.B D0,(A0)+⓪#MOVE.L A0,bufptr⓪ END⓪ END putbyte;⓪ ⓪ PROCEDURE putlong(b:LONGCARD);⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVE.L -(A3),(A0)+⓪#MOVE.L A0,bufptr⓪ END⓪ END putlong;⓪ ⓪ PROCEDURE putstring(s:pms);⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVE.L -(A3),A1⓪ lp MOVE.B (A1)+,(A0)+⓪#BNE lp⓪ ok MOVE.L A0,bufptr⓪ END⓪ END putstring;⓪ ⓪ PROCEDURE putbit(b:BOOLEAN);⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVE bitptr,D0⓪#TST -(A3)⓪#BNE b1⓪#BSET D0,(A0)⓪#BRA b2⓪ b1 BCLR D0,(A0)⓪ b2 ADDQ #1,D0⓪#ANDI #7,D0⓪#BNE b3⓪#ADDQ.L #1,A0⓪#MOVE.L A0,bufptr⓪ b3 MOVE D0,bitptr⓪ END⓪ END putbit;⓪ ⓪ PROCEDURE getbit:BOOLEAN;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVE bitptr,D0⓪#MOVEQ #0,D1⓪#BTST D0,(A0)⓪#SNE D1⓪ b2 ADDQ #1,D0⓪#ANDI #7,D0⓪#BNE b3⓪#ADDQ.L #1,A0⓪#MOVE.L A0,bufptr⓪ b3 MOVE D0,bitptr⓪#NEG.B D1⓪#MOVE D1,(A3)+⓪ END⓪ END getbit;⓪ ⓪ PROCEDURE getbyte():CHAR;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVEQ #0,D0⓪#MOVE.B (A0)+,D0⓪#MOVE.L A0,bufptr⓪#MOVE.B D0,(A3)+⓪#ADDQ.L #1,A3⓪ END⓪ END getbyte;⓪ ⓪ PROCEDURE getlong(VAR b:LONGCARD);⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVE.L -(A3),A1⓪#MOVE.L (A0)+,(A1)⓪#MOVE.L A0,bufptr⓪ END⓪ END getlong;⓪ ⓪ PROCEDURE getstring(VAR s:MaxStr);⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.L bufptr,A0⓪#MOVE.L -(A3),A1⓪ lp MOVE.B (A0)+,(A1)+⓪#BNE lp⓪ ok MOVE.L A0,bufptr⓪ END⓪ END getstring;⓪ ⓪ (*$L+,R=*)⓪ ⓪ PROCEDURE Lex(VAR s1,s2:ARRAY OF CHAR):INTEGER;⓪"BEGIN⓪$RETURN INTEGER (ORD (Compare (s1,s2))) - 1⓪"END Lex;⓪ ⓪ PROCEDURE LEN(VAR s:ARRAY OF CHAR):CARDINAL;⓪"BEGIN⓪$RETURN Length (s)⓪"END LEN;⓪ ⓪ PROCEDURE KbRead (VAR ch:CHAR);⓪"BEGIN⓪$REPEAT⓪&BusyRead (ch)⓪$UNTIL ch#0C⓪"END KbRead;⓪ ⓪ PROCEDURE WriteRpt (n:CARDINAL;c:CHAR);⓪"VAR i: CARDINAL;⓪"BEGIN⓪$FOR i:= 1 TO n DO⓪&Write (c)⓪$END⓪"END WriteRpt;⓪ ⓪ PROCEDURE Allocate(VAR a:ADDRESS; s:LONGCARD);⓪ BEGIN⓪"Storage.Allocate(a,s);⓪"IF a=NIL THEN WriteString('Out of mem');HALT END;⓪"IF Storage.MemAvail() < minmem THEN⓪$minmem:= Storage.MemAvail()⓪"END⓪ END Allocate;⓪ ⓪ PROCEDURE DeAllocate(VAR a:ADDRESS; s:LONGCARD);⓪ BEGIN⓪"Storage.DeAllocate(a,s)⓪ END DeAllocate;⓪ ⓪ PROCEDURE isOK(f:File;abort:BOOLEAN):BOOLEAN;⓪ VAR s:String;⓪ BEGIN⓪"IF State (f) < 0 THEN⓪$GetStateMsg (State(f),s);⓪$WriteLn;⓪$WriteString (s);⓪$WriteLn;⓪$IF abort THEN HALT END;⓪$RETURN false⓪"ELSE⓪$RETURN true⓪"END⓪ END isOK;⓪ ⓪ (*$D-*)⓪ PROCEDURE search(VAR symbol:MaxStr);⓪"PROCEDURE subsearch(VAR n1:noderef);⓪$VAR n:noderef;⓪"BEGIN⓪$n:=n1;⓪$IF n=NIL THEN⓪&NEW(n);⓪&WITH n^ DO⓪(Allocate(key,LONG(LEN(symbol)+1));⓪(Assign (symbol,key^,strok);⓪(cnt:=1L; bitcnt:=0; bitstr:=BitSet{}; left:=NIL; right:=NIL⓪&END;⓪&n1:=n;⓪&INC(stotal)⓪$ELSE⓪&CASE Lex(symbol,n^.key^) OF⓪&-1:subsearch(n^.left)|⓪'1:subsearch(n^.right)|⓪'0:INC(n^.cnt)⓪&END⓪$END⓪"END subsearch;⓪ BEGIN⓪"IF ~Empty(symbol) THEN⓪$subsearch(noderoot);⓪$symbol:=''⓪"END⓪ END search;⓪ (*$D-*)⓪ ⓪ PROCEDURE gentree;⓪"VAR ch:CHAR; symbol:MaxStr;⓪ (*$D-*)⓪ BEGIN⓪"symbol:=''; chars:=0L; stotal:=0; noderoot:=NIL;⓪"LOOP⓪$Text.Read(f,ch); INC(chars);⓪$IF isOK(f,true) THEN END;⓪$IF EOF(f) THEN search(symbol); EXIT⓪$ELSIF wordmode & (ch IN alpha) THEN Append(ch,symbol,strok);⓪$ELSIF ch#0C THEN search(symbol); Assign (ch, symbol, strok); search(symbol)⓪$ELSE warning:=true⓪$END⓪"END⓪ END gentree;⓪ (*$D-*)⓪ ⓪ PROCEDURE sorttree(VAR itemroot:itemref; noderoot:noderef);⓪"PROCEDURE subsort(n:noderef);⓪$PROCEDURE sortin(VAR i:itemref);⓪&VAR i1:itemref;⓪$BEGIN⓪&IF (i=NIL) OR (n^.cnt<i^.cnt) THEN⓪(NEW(i1);⓪(WITH i1^ DO⓪*cnt:=n^.cnt;⓪*nxt:=i;⓪*next:=i;⓪*NEW(cod);⓪*WITH cod^ DO⓪,cnt:=n^.cnt;⓪,nod:=n;⓪,left:=NIL;⓪,right:=NIL;⓪*END⓪(END;⓪(i:=i1⓪&ELSE⓪(sortin(i^.next);⓪(i^.nxt:=i^.next⓪&END⓪$END sortin;⓪"BEGIN⓪$IF n#NIL THEN⓪&subsort(n^.left);⓪&sortin(itemroot);⓪&subsort(n^.right);⓪$END⓪"END subsort;⓪ BEGIN⓪"itemroot:=NIL;⓪"subsort(noderoot)⓪ END sorttree;⓪ ⓪ PROCEDURE codetree(VAR c:coderef; i:itemref; s:CARDINAL);⓪"VAR i1:itemref; sum:LONGCARD;⓪"PROCEDURE codesortin(VAR i:itemref);⓪"BEGIN⓪$IF (i=NIL) OR (sum<i^.cnt) THEN⓪&i1^.next:=i;⓪&i:=i1⓪$ELSE⓪&codesortin(i^.next);⓪$END⓪"END codesortin;⓪ (*$D-*)⓪ BEGIN⓪"WHILE s>1 DO⓪$NEW(c);⓪$WITH c^ DO⓪&nod:=NIL; left:=i^.cod; right:=i^.next^.cod;⓪&IF (left = NIL) OR (right = NIL) THEN HALT END;⓪$END;⓪$sum:=i^.cnt+i^.next^.cnt;⓪$i1:=i;⓪$i:=i^.next^.next;⓪$WITH i1^ DO⓪&cnt:=sum; cod:=c;⓪$END;⓪$codesortin(i);⓪$DEC(s)⓪"END⓪ END codetree;⓪ (*$D-*)⓪ ⓪ PROCEDURE itemdisp(i:itemref);⓪"VAR i1:itemref;⓪ BEGIN⓪"WHILE i#NIL DO⓪$i1:=i^.nxt;⓪$DISPOSE(i);⓪$i:=i1⓪"END⓪ END itemdisp;⓪ ⓪ PROCEDURE nodedisp(n:noderef);⓪ BEGIN⓪"IF n#NIL THEN⓪$WITH n^ DO⓪&DISPOSE(key);⓪&nodedisp(left);⓪&nodedisp(right);⓪$END;⓪$DISPOSE(n)⓪"END⓪ END nodedisp;⓪ ⓪ PROCEDURE codedisp(c:coderef);⓪ BEGIN⓪"WITH c^ DO⓪$IF nod=NIL THEN⓪&codedisp(left);⓪&codedisp(right);⓪$END;⓪$DISPOSE(c)⓪"END⓪ END codedisp;⓪ ⓪ PROCEDURE dcodedisp(c:coderef);⓪ BEGIN⓪"WITH c^ DO⓪$IF nod=NIL THEN⓪&dcodedisp(left);⓪&dcodedisp(right);⓪$ELSE⓪&DeAllocate(key,0L)⓪$END;⓪$DISPOSE(c)⓪"END⓪ END dcodedisp;⓪ ⓪ PROCEDURE measure(c:coderef; depth:CARDINAL):LONGCARD;⓪ VAR l:LONGCARD;⓪ (*$D-*)⓪ BEGIN⓪"WITH c^ DO⓪$IF nod=NIL THEN⓪&INC(treesize);⓪&l:=measure(ADDRESS(left),depth+1)+measure(ADDRESS(right),depth+1);⓪&RETURN l⓪$ELSE⓪&WITH nod^ DO⓪(INC(treesize);⓪(IF wordmode THEN INC(treesize,LEN(key^)) END;⓪(RETURN LONG(depth)*cnt⓪&END⓪$END⓪"END⓪ END measure;⓪ (*$D-*)⓪ ⓪ PROCEDURE makebuffer(VAR buf:ADDRESS; bsize:LONGCARD; VAR blocks:CARDINAL);⓪ BEGIN⓪"blocks:=SHORT((bsize+1023L) DIV 1024L);⓪"Allocate(buf,1024L*LONG(blocks+1));⓪ END makebuffer;⓪ ⓪ ⓪ PROCEDURE putcodetree(codesize:LONGCARD; coderoot:coderef);⓪"PROCEDURE subput(c:coderef; dep:CARDINAL; str:BitSet);⓪"BEGIN⓪$WITH c^ DO⓪&IF nod=NIL THEN⓪(putbyte(0);⓪(subput(left, dep+1, str);⓪(INCL(str,dep);⓪(subput(right, dep+1, str)⓪&ELSE⓪(WITH nod^ DO⓪*IF wordmode THEN putstring(key) ELSE putbyte(ORD(key^[0])) END;⓪*bitcnt:=dep-1;⓪*bitstr:=str⓪(END⓪&END⓪$END⓪"END subput;⓪ BEGIN⓪"putlong(codesize);⓪"putbyte(ORD(wordmode));⓪"subput(coderoot, 0, BitSet{})⓪ END putcodetree;⓪ ⓪ PROCEDURE getcodetree(VAR csize:LONGCARD; VAR croot:coderef);⓪"VAR symbol:MaxStr; c:coderef; wordflag:BOOLEAN; ch:CHAR;⓪"PROCEDURE subget(VAR c:coderef);⓪"BEGIN⓪$NEW(c);⓪$WITH c^ DO⓪&IF wordflag THEN⓪(getstring(symbol);⓪(IF LEN(symbol)=0 THEN⓪*key:=NIL; subget(left); subget(right)⓪(ELSE⓪*Allocate(key,LONG(LEN(symbol)+1));⓪*Assign (symbol,key^,strok);⓪*left:=NIL; right:=NIL⓪(END⓪&ELSE⓪(ch:=getbyte();⓪(IF ch=0C THEN⓪*key:=NIL; subget(left); subget(right)⓪(ELSE⓪*Allocate(key,2L);⓪*Assign (ch, key^, strok);⓪*left:=NIL; right:=NIL⓪(END⓪&END⓪$END⓪"END subget;⓪ BEGIN⓪"getlong(csize);⓪"wordflag:= BOOLEAN (ORD(getbyte()));⓪"subget(croot)⓪ END getcodetree;⓪ ⓪ PROCEDURE encode;⓪"VAR ch:CHAR; symbol:MaxStr;⓪"PROCEDURE encsym(n:noderef);⓪$VAR i:CARDINAL;⓪"BEGIN⓪$IF LEN(symbol)>0 THEN⓪&LOOP⓪(IF n=NIL THEN WriteString('Serious error'); HALT⓪(ELSE⓪*CASE Lex(symbol,n^.key^) OF⓪*-1:n:=n^.left |⓪+1:n:=n^.right |⓪+0:FOR i:=0 TO n^.bitcnt DO putbit(i IN n^.bitstr) END; EXIT⓪*END⓪(END⓪&END;⓪&symbol:=''⓪$END⓪"END encsym;⓪ BEGIN⓪"bitptr:=0; symbol:='';⓪"LOOP⓪$Text.Read(f,ch);⓪$IF isOK(f,true) THEN END;⓪$IF EOF(f) THEN encsym(noderoot); EXIT⓪$ELSIF wordmode & (ch IN alpha) THEN Append (ch,symbol,strok)⓪$ELSIF ch#0C THEN encsym(noderoot); Assign (ch, symbol, strok); encsym(noderoot)⓪$ELSE warning:=true⓪$END⓪"END⓪ END encode;⓪ ⓪ PROCEDURE decode(disp:BOOLEAN);⓪"VAR c:coderef; lines:CARDINAL; cr:MaxStr; stop,flow:BOOLEAN; ch:CHAR;⓪ BEGIN⓪"getcodetree(codesize,coderoot);⓪"bitptr:=0;⓪"c:=coderoot;⓪"cr:=15C;⓪"lines:=0;⓪"stop:=false;⓪"flow:=false;⓪"LOOP⓪$IF codesize=0L THEN EXIT END;⓪$IF getbit() THEN⓪&c:=c^.left⓪$ELSE⓪&c:=c^.right⓪$END;⓪$DEC(codesize);⓪$IF c^.key#NIL THEN⓪&WITH c^ DO⓪(IF disp THEN⓪*WriteString(key^);⓪*IF (LEN(key^)=1) & StrEqual(key^,cr) THEN⓪,INC(lines);⓪,BusyRead (ch);⓪,IF ch#0C THEN⓪.flow:=false; stop:=true⓪,ELSIF NOT flow & (stop OR (lines>20)) THEN⓪.WriteString(' More. /?/ for help');⓪.KbRead(ch);⓪.WriteRpt(19,10C);WriteRpt(19,' ');WriteRpt(19,10C);⓪.IF ch='?' THEN⓪0WriteString('/space/ to stop, /return/ for flow, ');⓪0WriteString('letter for 10 lines, ctrl-key for 20');⓪0WriteLn⓪.ELSIF ch>' ' THEN⓪0lines:=10; stop:=false; flow:=false;⓪.ELSE⓪0IF ch=' ' THEN⓪2stop:=true; flow:=false;⓪0ELSIF ch=33C THEN EXIT⓪0ELSIF ch=15C THEN⓪2flow:=true; stop:=false;⓪0END;⓪0lines:=0⓪.END;⓪,END⓪*END⓪(ELSE⓪*Text.WriteString(outf,key^)⓪(END⓪&END;⓪&c:=coderoot⓪$END⓪"END;⓪"dcodedisp(coderoot);⓪ END decode;⓪ ⓪ PROCEDURE packfile;⓪"VAR ch:CHAR;⓪ BEGIN⓪"minmem:=Storage.MemAvail();⓪"filename:='';⓪"WriteString('Pack what text? ');⓪"ReadString (filename);⓪"IF Empty (filename) THEN RETURN END;⓪"WriteLn;⓪"WriteString('Use W(ord or C(har-packing algorithm? ');⓪"REPEAT KbRead(ch); UNTIL CAP(ch) IN charset{'W','C',33C};⓪"IF ch=33C THEN RETURN END;⓪"Write(ch); WriteLn; WriteLn;⓪"wordmode:=CAP(ch)='W';⓪"Open(f,filename,readOnly);⓪"IF isOK(f,false) THEN⓪$(* AssignString(ofilename,LEN(ofilename)-3,'Pack'); *)⓪$WriteString('output-filename? ');⓪$ReadString (ofilename);⓪$IF Empty (ofilename) THEN⓪&Close(f); RETURN⓪$END;⓪$warning:=false;⓪$WriteLn;⓪$WriteString('first pass.');WriteLn;⓪$gentree;⓪$IF warning THEN⓪&WriteString('Warning: ASCII-Null ignored!');WriteLn;⓪$END;⓪$WriteString('sorting.');WriteLn;⓪$sorttree(itemroot,noderoot);⓪$WriteString('building code.');WriteLn;⓪$codetree(coderoot,itemroot,stotal);⓪$treesize:=5L; codesize:=measure(coderoot,0);⓪$itemdisp(itemroot);⓪$bytes:=treesize+(codesize+7L) DIV 8L;⓪$makebuffer(pbuf,bytes,blocks);⓪$bufptr:=pbuf;⓪$putcodetree(codesize,coderoot);⓪$codedisp(coderoot);⓪$Seek (f,0,fromBegin);⓪$IF isOK(f,false) THEN⓪&WriteString('second pass.');WriteLn;⓪&encode;⓪&Create(outf,ofilename,writeOnly,replaceOld);⓪&IF isOK(outf,false) THEN⓪(WriteBytes(outf,pbuf,LONG(blocks)*1024L);⓪(IF isOK(outf,false) THEN⓪*DeAllocate(pbuf,0L);⓪*Close(outf);⓪*IF isOK(outf,false) THEN⓪,(*⓪.WriteString('maximum memory used:');⓪.WriteCard(Storage.MemAvail()-minmem,7);WriteLn;⓪,*)⓪,WriteString('chars read :');⓪,WriteCard(chars,7);WriteLn;⓪,WriteString('unique symbols :');⓪,WriteCard(stotal,7);WriteLn;⓪,WriteString('bytes written :');⓪,WriteCard(bytes,7);WriteLn;⓪,WriteString('percentage :');⓪,WriteCard((100L*bytes) DIV chars,7); WriteLn⓪*END⓪(ELSE⓪*Remove(outf)⓪(END⓪&ELSE⓪(Remove (outf)⓪&END;⓪&nodedisp(noderoot);⓪&Close(f)⓪$END⓪"END⓪ END packfile;⓪ ⓪ PROCEDURE unpackfile;⓪ VAR bread:LONGCARD;⓪ BEGIN⓪"filename:='';⓪"WriteString('Unpack what file? ');⓪"ReadString (filename);⓪"IF Empty (filename) THEN RETURN END;⓪"WriteLn;⓪"Open(f,filename,readOnly);⓪"IF isOK(f,false) THEN⓪$makebuffer(pbuf,FileSize(f),blocks);⓪$bufptr:=pbuf;⓪$ReadBytes(f,pbuf,LONG(blocks)*1024L,bread);⓪$IF isOK(f,false) THEN⓪&Close(f);⓪&ofilename:='';⓪&WriteString('To what file ? ');⓪&ReadString (ofilename);⓪&IF ~Empty (ofilename) THEN⓪(Create(outf,ofilename,writeSeqTxt,replaceOld);⓪(IF isOK(outf,false) THEN⓪*decode(false);⓪*Close(outf)⓪(END⓪&END⓪$ELSE⓪&Close(f)⓪$END;⓪$DeAllocate(pbuf,0L)⓪"END (* IF isOK *)⓪ END unpackfile;⓪ ⓪ ⓪ VAR ch:CHAR;⓪ ⓪ BEGIN⓪"LOOP⓪$WriteLn;⓪$WriteString('Do you want to... P(ack, U(npack or Q(uit ? ');⓪$REPEAT⓪&KbRead(ch)⓪$UNTIL CAP(ch) IN charset{'P','U','Q',33C};⓪$WriteLn; WriteLn;⓪$IF CAP(ch)='P' THEN packfile⓪$ELSIF CAP(ch)='U' THEN unpackfile⓪$ELSE EXIT⓪$END⓪"END;⓪"WriteString('Bye.');⓪"WriteLn⓪ END Pack.⓪ ə
- (* $00001813$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$00002FAC$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$00001B8C$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4A$FFFC8A4AÇ$00002FBFT.......T.......T.......TT......T.......T.......T.......T.......T.......T.......$0000014F$00002FA9$00002F61$00002FBF$0000184F$00001BE9$FFEE44C4$FFEE44C4$00000CF6$00000D23$00000D68$00000D7C$00000D87$00000CB9$00000100$0000004EÉÇâ*)
-